package cn.itcast.crawler;

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

// 带有参数的Post请求
// 对于Get请求而言，其参数在url地址中使用?来进行分隔
// Post请求的参数则不会出现在url地址中，而是通过请求体进行封装，所以我们不能和Get请求一个通过设置在url中设置请求参数来实现
// 带参数的Post请求
// 对于Post请求的参数，我们需要通过List集合来进行参数的封装，所谓的参数实际上类似于键值对，List中存放的是接口NameValuePair
// 的实现类BasicNameValuePair(唯一实现类),最后通过httpPost对象的set方法进行请求体的设置，这是大致的逻辑思路
@SuppressWarnings("all")
public class HttpPostParmasTest {
    public static void main(String[] args) {
        // 创建浏览器客户端对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 设置url地址
        String url = "http://yun.itheima.com/search";

        // 创建Post请求对象
        HttpPost httpPost = new HttpPost(url);

        // 设置Post请求的请求体
        // 1. 创建list容器封装所有的请求参数
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // 2. 向容器内添加参数，即键值对 该实现类只有两个set方法用于设置键值对
        params.add(new BasicNameValuePair("keys","Java"));

        try {
            // 3. 由于Post请求多数为表单提交内容，我们需要创建表单的提交的Entity对象
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"utf8");

            // 4. 设置Post请求对象的实体,至此我们的带参数的Post请求的参数部分已经实现了，下面的代码和之前一样
            httpPost.setEntity(entity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // 创建响应对象
        CloseableHttpResponse response = null;
        try {
            // 获取响应
            response = httpClient.execute(httpPost); // 空指针

            // 判断响应码
            if (response.getStatusLine().getStatusCode() == 200) {
                // 获取响应内容
                String content = EntityUtils.toString(response.getEntity(),"utf8");

                // 解析内容
                System.out.println(content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
